package org.jeecg.modules.flow.sys.entity.dto;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;

import java.util.Objects;

/*
 * 说明：
 *  【businessType、documentType】和【infoId】 两个组合必需要填一种，如果不存在【infoId】就填【businessType、documentType】；
 *  【code】必填，涉及到运行到那个节点；
 *  【data】根据回调的处理逻辑，传入对应的入参；
 *  【refuseType】如果流程中止，则该值必填
 * 项目名称:    wms-server-jeecg
 * 接口描述:    流程请求参数体
 * 创建人员:    zhaojun
 * 创建时间:    2023-09-13
 */
@Data
public class BaseFlowDto<T> extends BaseInnerDataDto {

    /**
     * 业务单据
     */
    private String businessType;

    /**
     * 单据类型
     */
    /**
     * 单据类型
     */
    private String documentType;

    /**
     * 通用业务的主键id
     */
    private String infoId;

    /**
     * 流程唯一编码
     */
    private String code;

    /**
     * 请求数据信息
     */
    private T data;

    /**
     * 目标节点编码（目前是）
     */
    private String targetCode;

    /**
     * 中止的原因 1、手工关闭  2、强制完成 3、取消 4、异常关闭
     */
    private Integer refuseType;

    /**
     * 备注
     */
    private String remark;

    /**
     * 结合回调配置，自定义后接的<k,v> 处理
     * testCallBack?a=zs&b=ls
     */
    private JSONObject extraParam;

    public void setData(T data) {
        if (ObjectUtils.isNotEmpty(data)) {
            this.data = (T) JSON.toJSONString(data);
        } else {
            this.data = null;
        }
    }

    public void translateClass(Class dataClass) {
        if (ObjectUtils.isNotEmpty(dataClass)) {
            if (dataClass.equals(JSONObject.class)) {
                if (Objects.isNull(data)) {
                    this.data = (T) new JSONObject();
                } else {
                    this.data = (T) JSON.parseObject(JSON.parse((String) data).toString(), dataClass);
                }
            } else {
                this.data = (T) JSON.parseObject((String) data, dataClass);
            }
        }
    }

}
